![]() |
![]() |
|
Das modale Öffnen hat zur Folge, dass im aufrufenden Formular die Anweisungen, die ShowDialog folgen, solange nicht ausgeführt werden, bis der modale Dialog geschlossen wird. Mit dem Schließen liefert die modale Form gleichzeitig auch als Resultat den Inhalt seiner Eigenschaft DialogResult beim Aufrufer ab. Jetzt kann die aufrufenden Form das Ergebnis prüfen und, je nachdem, welche Schaltfläche zum Beenden des Dialogs geführt hat, passend reagieren. Das könnte beispielsweise wie folgt aussehen, wenn der Dialog eine OK- und eine Abbrechen-Schaltfläche hat:
Enthält ein modaler Dialog mehr als zwei auszuwertende Schaltflächen, muss ein anderer Weg beschritten werden, um nicht unglücklicherweise mehrfach denselben Dialog zu öffnen. Hier bieten sich zwei Möglichkeiten an. Die erste ist das Zuweisen der Rückgabe an eine Variable vom Typ DialogResult, die in If-Zweigen geprüft wird:
Etwas eleganter ist eine Select-Anweisung, um in den Case-Zweigen auf den Rückgabewert zu reagieren:
15.9.4 Die Weitergabe von Resultaten aus einem Dialog
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ' ---------------------------------------------------------- |
| ' Beispiel: ...\Kapitel 15\ÜbernehmenSchaltfläche |
| ' ---------------------------------------------------------- |
| Public Class DialogForm |
| ' Deklaration des Ereignisses "Apply" |
| Public Event Apply As EventHandler |
| Private Sub btnUebernehmen_Click(...) _ |
| Handles btnUebernehmen.Click |
| RaiseEvent Apply(Me, e) |
| Me.btnUebernehmen.Enabled = False |
| End Sub |
| Private Sub TextBox1_TextChanged(...) _ |
| Handles TextBox1.TextChanged |
| If Me.TextBox1.Text = Me.Owner.Text Then |
| Me.btnUebernehmen.Enabled = False |
| Else |
| Me.btnUebernehmen.Enabled = True |
| End If |
| End Sub |
| Private Sub DialogForm_Load(...) _ |
| Handles MyBase.Load |
| Me.TextBox1.Text = Me.Owner.Text |
| End Sub |
| End Class |
Klickt der Anwender auf die Schaltfläche Übernehmen, wird innerhalb des Ereignishandlers Apply ausgelöst. Da Click vom Typ EventHandler ist und die Übergabe der Referenz auf die Ereignisquelle sowie die Referenz auf ein Objekt des Typs EventArgs verlangt, werden mit
| RaiseEvent Apply(Me, e) |
auch alle Argumente weitergeleitet.
Nachdem das Ereignis Apply der aufrufenden Form signalisiert hat, dass neue Daten bereitgestellt werden, kann die Übernehmen-Schaltfläche deaktiviert werden. Dazu wird die Eigenschaft Enabled=False gesetzt.
Ehe wir uns weiter dem Code im Dialog widmen, sehen wir uns zunächst den Code des aufrufenden Hauptfensters an. Dieses enthält nur die Schaltfläche zum Öffnen des modalen Dialogs.
| Public Class Form1 |
| Private Sub btnOpenDialog_Click(...) _ |
| Handles btnOpenDialog.Click |
| Dim frm As New DialogForm |
| AddHandler frm.Apply, AddressOf SetFormText |
| Dim dr As DialogResult = frm.ShowDialog(Me) |
| If dr = System.Windows.Forms.DialogResult.OK Then |
| Me.Text = frm.TextBox1.Text |
| End If |
| End Sub |
| ' Ereignishandler des Ereignisses Apply |
| Private Sub SetFormText(...) |
| Me.Text = CType(sender, DialogForm).TextBox1.Text |
| End Sub |
| End Class |
Im Ereignishandler btnOpenDialog_Click wird die Klasse DialogForm instanziert und das Ereignis Apply des Objekts mit einem Ereignishandler verknüpft. Aufgerufen wird der Dialog mit der parametrisierten Variante von ShowDialog, der die Referenz auf das aufrufende Hauptfenster übergeben wird. Der modale Dialog empfängt die Übergabe und speichert sie automatisch in seiner Eigenschaft Owner. Damit hat der modale Dialog auch jederzeit direkten Zugriff auf die aufrufende Form. Zum Schluss erfolgt noch die Überprüfung, ob der modale Dialog mit OK geschlossen worden ist. In diesem Fall gilt es, den Inhalt der Textbox auszuwerten.
Kommen wir noch einmal zurück zur Klassendefinition von DialogForm. Nach dem Öffnen des Dialogs soll die Textbox den Inhalt der Titelleiste des aufrufenden Dialogs enthalten. Hier kommt uns zugute, dass wir beim Aufruf von ShowDialog die Referenz auf den Aufrufer übergeben haben. So können wir im Load-Ereignis über Owner die Titelleiste abfragen und der Text-Eigenschaft der Textbox zuweisen.
Eine Textbox reagiert auf jede Änderung im Eingabefeld und löst das Ereignis TextChanged aus. Wir machen uns das im Dialog zunutze, um die Aktivierung/Deaktivierung der Schaltfläche Übernehmen zu steuern. Entspricht der Inhalt der Textbox exakt der Titelleiste des Hauptfensters, gibt es nichts vom Hauptfenster zu übernehmen und die Schaltfläche wird mit der Eigenschaft Enabled deaktiviert (Enabled=False). Weicht der Inhalt der Textbox von der Titelleiste ab, ist der Button aktiviert (Enabled=True).
Eigentlich könnten wir mit dem Ergebnis zufrieden sein, denn der Dialog zeigt bereits alle typischen Verhaltensmerkmale. Ein wenig selbstkritisch sollten wir aber dennoch sein, denn es gibt noch ein paar Verbesserungen vorzunehmen. Damit sind die folgenden beiden Punkte gemeint:
| die Fokussierreihenfolge der Steuerelemente |
| Sonderfunktionen der (Enter)- und (ESC)-Tasten |
Wenden wir uns zunächst der Fokussierreihenfolge zu.
Alle fokussierbaren Steuerelemente einer Form können mit der (Tab)-Taste der Reihe nach aktiviert werden. Nach dem Öffnen und Anzeigen eines Formulars sollten zuerst die Steuer-elemente aktiviert werden, die eine Eingabe vom Anwender erwarten, anschließend die Schaltflächen. Innerhalb dieser beiden Gruppen ist die Fokussierreihenfolge konventionsgemäß zuerst von links nach rechts, danach von oben nach unten. Das gilt natürlich nicht nur für modale Dialoge, auch alle anderen Forms sollten sich daran halten.
Mit der Eigenschaft TabIndex der Steuerelemente können wir die Fokussierreihenfolge in einer Form vorschreiben. Dabei erhält das Element zuerst den Fokus, dessen TabIndex-Eigenschaft den Wert 0 hat, danach wird das Steuerelement mit dem Wert 1 fokussiert usw. TabIndex wird in der Reihenfolge vergeben, in der die Controls der Form hinzugefügt werden. Sie können die Werte im Eigenschaftsfenster der Steuerelemente auch beliebig den Erfordernissen anpassen.
Wird der Dialog unseres letzten Beispiels geöffnet, sollte sich der Eingabecursor in der Textbox befinden, um den Anwender die sofortige Eingabe zu ermöglichen. Die Eigenschaft TabIndex dieses Steuerelements hat demnach den Wert 0. In der Aktivierungsreihenfolge schließt sich dann die OK-Schaltfläche an, gefolgt von Abbrechen und Übernehmen. Die Werte von TabIndex sind für die drei Schaltflächen entsprechend 1, 2 und 3.
Bei vielen Forms kommt der (Enter)-Taste (Eingabetaste) eine besondere Bedeutung zu. Ist eine Schaltfläche fokussiert und wird die (Eingabetaste) gedrückt, wird das Click-Ereignis der fokussierten Schaltfläche ausgelöst. Wird die (Enter)-Taste gedrückt, während beispielsweise eine Textbox den Fokus hat, reagieren viele Formulare so, als sei die OK-Schaltfläche angeklickt worden.
Um eine bestimmte Schaltfläche zur Standardschaltfläche eines Formulars zu erklären, veröffentlicht die Klasse Form die Eigenschaft AcceptButton. Wollen wir die OK-Schaltfläche zur Standardschaltfläche unseres modalen Dialogs machen, muss die Anweisung lauten:
| Me.AcceptButton = btnOK |
Ein ähnliches Verhalten zeigen Formulare, wenn die (ESC)-Taste gedrückt wird. Allerdings entspricht das nicht dem Klicken auf die OK-Schaltfläche, sondern ist gleichbedeutend mit dem Klicken auf Abbrechen – das Formular wird geschlossen. Diesmal müssen wir der Eigenschaft CancelButton der Form die Referenz der formeigenen Abbrechen-Schaltfläche bekannt geben:
| Me.CancelButton = btnAbbrechen |
AcceptButton und CancelButton können natürlich auch im Eigenschaftsfenster eingestellt werden.
| << zurück |
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken.
Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die
gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich
geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung,
Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.